#ifndef IPC_VALUE_H
#define IPC_VALUE_H

#include <string.h>

#include "internal/cef_string.h"
#include "capi/cef_values_capi.h"
#include "capi/cef_v8_capi.h"

#include "tools/log_util.h"
#include "logger.h"

// ipc 数据值封装
typedef enum {
    IPC_TYPE_BOOL,
    IPC_TYPE_INT,
    IPC_TYPE_DOUBLE,
    IPC_TYPE_STRING,
    IPC_TYPE_BINARY,
    IPC_TYPE_LIST
} IPC_Value_Type;

// list 时数据存在next， 第一个为链表头，存数据类型，不直接存数据。
typedef struct _ipc_value_t{
    IPC_Value_Type type;
    int count;                  // 数据数量
    int size;                   // 数据大小，所占字节数
    struct _ipc_value_t *next;
    union {
        int Bool;
        int Int;
        double Double;
        char* String;
        void* Binary;           // 二进制数据, 文件传输
    } value;
} IPC_Value;


IPC_Value* ipc_value_create_by_cef_value(cef_value_t *value);

/**
 * ipc_value 为null时返回空对象，为 js null
 */
cef_value_t* ipc_value_to_cef_value(IPC_Value* ipc_value);

void ipc_value_set_string(IPC_Value* ipc_value, char* str);
void ipc_value_free(IPC_Value* ipc_value);

IPC_Value* _create_ipc_value_int(int value);
IPC_Value* _create_ipc_value_double(double value);
IPC_Value* _create_ipc_value_bool(int value);
IPC_Value* _create_ipc_value_string(char* value);
IPC_Value* _create_ipc_value_binary(void* data, int size);
/**
 * 创建新的列表类型 IPC_Value
 * 
 * @return 新创建的列表头节点
 */
IPC_Value* _create_ipc_value_list();
/**
 * 向列表中添加元素
 * 
 * @param list 列表头节点
 * @param element 要添加的元素
 * @return 添加元素后的列表头节点
 */
IPC_Value* _list_add_element(IPC_Value* list, IPC_Value* element);

int _ipc_value_get_int(IPC_Value* ipc_value);
double _ipc_value_get_double(IPC_Value* ipc_value);
char* _ipc_value_get_string(IPC_Value* ipc_value);
int _ipc_value_get_bool(IPC_Value* ipc_value);

IPC_Value_Type _ipc_value_get_type(IPC_Value* ipc_value);

// ----------------------多参数支持 ---------------------------------------------------
IPC_Value *ipc_value_create_by_cef_list_value(cef_list_value_t *cef_list);
// 辅助函数：转换单个CEF值为IPC值（不递归处理列表）
static IPC_Value *convert_single_cef_value(cef_list_value_t *cef_list, int index);
/**
 * 获取列表长度（元素数量）
 * 
 * @param value IPC_Value 节点
 * @return 元素数量
 */
int ipc_value_get_count(IPC_Value *value);
/**
 * 根据下标获取 IPC_Value 链表中的元素
 * 
 * @param value IPC_Value 链表头节点
 * @param index 要获取的元素下标
 * @return 找到的元素节点指针，如果下标无效返回 NULL
 */
IPC_Value *_ipc_value_get_element(IPC_Value *value, int index);
cef_list_value_t *ipc_value_to_cef_list_value(IPC_Value *ipc_value);



#endif